#!/usr/bin/env python3
"""
图片显示问题诊断总结
"""
import asyncio
import httpx
import sqlite3
import os

def check_database_images():
    """
    检查数据库中的图片字段
    """
    print("=== 数据库图片字段检查 ===")
    
    # 查找数据库文件
    db_paths = [
        'hackplay.db',
        'app/hackplay.db',
        '../hackplay.db'
    ]
    
    db_path = None
    for path in db_paths:
        if os.path.exists(path):
            db_path = path
            break
    
    if not db_path:
        print("❌ 未找到数据库文件")
        return
    
    try:
        conn = sqlite3.connect(db_path)
        cursor = conn.cursor()
        
        # 查询前5个竞赛的图片字段
        cursor.execute("""
            SELECT id, title, image_url, banner_image 
            FROM competitions 
            LIMIT 5
        """)
        
        results = cursor.fetchall()
        
        print(f"\n📊 数据库中前5个竞赛的图片字段:")
        print("-" * 80)
        
        for row in results:
            comp_id, title, image_url, banner_image = row
            print(f"\nID: {comp_id}")
            print(f"标题: {title[:50]}")
            print(f"image_url: {image_url or '(空)'}")
            print(f"banner_image: {banner_image or '(空)'}")
            
            if banner_image:
                if 'trae-api-us.mchost.guru' in banner_image:
                    print(f"✅ 包含Trae API生成的图片")
                else:
                    print(f"ℹ️  外部图片URL")
        
        # 统计图片字段使用情况
        cursor.execute("""
            SELECT 
                COUNT(*) as total,
                COUNT(image_url) as has_image_url,
                COUNT(banner_image) as has_banner_image
            FROM competitions
        """)
        
        stats = cursor.fetchone()
        total, has_image_url, has_banner_image = stats
        
        print(f"\n📈 统计信息:")
        print(f"总竞赛数: {total}")
        print(f"有image_url的: {has_image_url}")
        print(f"有banner_image的: {has_banner_image}")
        
        conn.close()
        
    except Exception as e:
        print(f"❌ 数据库查询失败: {e}")

async def check_api_responses():
    """
    检查API响应
    """
    print("\n=== API响应检查 ===")
    
    try:
        async with httpx.AsyncClient() as client:
            # 测试竞赛列表API
            response = await client.get("http://localhost:8000/api/v1/competitions/?page=1&size=3")
            
            if response.status_code == 200:
                data = response.json()
                competitions = data.get('items', data) if isinstance(data, dict) else data
                
                print(f"\n📡 API返回的前3个竞赛图片字段:")
                print("-" * 80)
                
                for i, comp in enumerate(competitions[:3]):
                    print(f"\n竞赛 {i+1}: {comp.get('title', '')[:50]}")
                    print(f"API返回的image_url: {comp.get('image_url') or '(空)'}")
                    print(f"API返回的banner_image: {comp.get('banner_image') or '(空)'}")
                    
                    banner_image = comp.get('banner_image')
                    if banner_image and 'trae-api-us.mchost.guru' in banner_image:
                        print(f"✅ 包含Trae API URL")
            else:
                print(f"❌ API请求失败: {response.status_code}")
                
    except Exception as e:
        print(f"❌ API测试失败: {e}")

async def check_image_proxy():
    """
    检查图片代理服务
    """
    print("\n=== 图片代理服务检查 ===")
    
    try:
        async with httpx.AsyncClient() as client:
            # 测试Trae图片代理
            test_url = "http://localhost:8000/api/v1/image/trae-image?prompt=test&image_size=landscape_4_3"
            
            response = await client.head(test_url, timeout=10.0)
            
            if response.status_code == 200:
                print(f"✅ 图片代理服务正常 (状态码: {response.status_code})")
                print(f"内容类型: {response.headers.get('content-type', 'unknown')}")
            else:
                print(f"❌ 图片代理服务异常 (状态码: {response.status_code})")
                
    except Exception as e:
        print(f"❌ 图片代理测试失败: {e}")

def analyze_frontend_logic():
    """
    分析前端图片处理逻辑
    """
    print("\n=== 前端图片处理逻辑分析 ===")
    
    print("\n🔍 前端图片处理流程:")
    print("1. HackCard组件接收竞赛数据")
    print("2. 使用getImageUrl()函数处理图片URL")
    print("3. 优先使用image_url，如果为空则使用banner_image")
    print("4. 如果URL包含trae-api-us.mchost.guru，则通过代理访问")
    print("5. 代理URL格式: http://localhost:8000/api/v1/image/trae-image?prompt=...&image_size=...")
    print("6. 如果图片加载失败，回退到默认图片")
    
    print("\n📝 调试建议:")
    print("1. 打开浏览器开发者工具查看控制台日志")
    print("2. 访问 http://localhost:3000/debug-images 查看详细的图片处理信息")
    print("3. 检查网络面板中的图片请求状态")
    print("4. 确认图片代理服务是否正常响应")

def provide_solutions():
    """
    提供解决方案
    """
    print("\n=== 问题解决方案 ===")
    
    print("\n🔧 可能的问题和解决方案:")
    
    print("\n1. 图片代理服务问题:")
    print("   - 确保后端服务正在运行")
    print("   - 检查图片代理端点是否正确响应")
    print("   - 验证Trae API的可访问性")
    
    print("\n2. 前端图片处理问题:")
    print("   - 检查getImageUrl函数的逻辑")
    print("   - 确认needsProxy函数正确识别需要代理的URL")
    print("   - 验证环境变量NEXT_PUBLIC_API_URL的设置")
    
    print("\n3. 数据库数据问题:")
    print("   - 确认banner_image字段包含有效的URL")
    print("   - 检查image_url字段是否为空")
    print("   - 验证URL格式是否正确")
    
    print("\n4. 网络和CORS问题:")
    print("   - 检查浏览器网络面板中的请求状态")
    print("   - 确认没有CORS错误")
    print("   - 验证图片代理的CORS头设置")
    
    print("\n✅ 推荐的调试步骤:")
    print("1. 访问调试页面: http://localhost:3000/debug-images")
    print("2. 打开浏览器开发者工具查看控制台和网络面板")
    print("3. 检查图片请求的状态码和响应")
    print("4. 如果图片仍然不显示，检查Image组件的onError事件")

async def main():
    """
    主函数
    """
    print("🔍 图片显示问题诊断报告")
    print("=" * 60)
    
    # 检查数据库
    check_database_images()
    
    # 检查API响应
    await check_api_responses()
    
    # 检查图片代理
    await check_image_proxy()
    
    # 分析前端逻辑
    analyze_frontend_logic()
    
    # 提供解决方案
    provide_solutions()
    
    print("\n" + "=" * 60)
    print("📋 诊断完成！请根据上述信息进行问题排查。")

if __name__ == "__main__":
    asyncio.run(main())